package PenTest.huawei.huawei1113;

import java.util.ArrayList;
import java.util.List;

public class Main1 {
//    给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。
//
//    注意：不要求字典中出现的单词全部都使用，并且字典中的单词可以重复使用。
//    示例 1：
//
//    输入: s = "leetcode", wordDict = ["leet", "code"]
//    输出: true
//    解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
//    示例 2：
//
//    输入: s = "applepenapple", wordDict = ["apple", "pen"]
//    输出: true
//    解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。
//    注意，你可以重复使用字典中的单词。
//    示例 3：
//
//    输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
//    输出: false
//    提示：
//            1 <= s.length <= 300
//            1 <= wordDict.length <= 1000
//            1 <= wordDict[i].length <= 20
//    s 和 wordDict[i] 仅由小写英文字母组成
//    wordDict 中的所有字符串 互不相同

    public static void main(String[] args) {

//        ArrayList arrayList = new ArrayList<>();
//        arrayList.add("leet");
//        arrayList.add("code");
//        System.out.println(backTrack("leetcode", arrayList, 0));
        ArrayList arrayList = new ArrayList<>();
        arrayList.add("apple");
        arrayList.add("pen");
        System.out.println(backTrack("applepenapple", arrayList, 0));
//        ArrayList arrayList = new ArrayList<>();
//        arrayList.add("cats");
//        arrayList.add("dog");
//        arrayList.add("sand");
//        arrayList.add("and");
//        arrayList.add("cat");
//        System.out.println(backTrack("catsandog", arrayList, 0));
    }

    private static StringBuilder sb=new StringBuilder();

    private static boolean backTrack(String s, List<String> wordDict, int index) {
        if (index == s.length()&&sb.toString().equals(s)) {
            return true;
        }
        for (int i = index; i < s.length(); i++) {
            for (int j = 0; j < wordDict.size(); j++) {
                int len = wordDict.get(j).length();
                if (i + len <= s.length() && s.substring(i, i + len).equals(wordDict.get(j))) {
                    sb.append(wordDict.get(j));
                    boolean flag = backTrack(s, wordDict, i + len);
                    if (flag) {
                        return true;
                    }
                    sb.replace(sb.length() - len, sb.length(), "");
                }
            }
        }
        return false;
    }

}
